//package com.lichuang.fruitvarietysm.user.controller;
//
//import com.lichuang.fruitvarietysm.user.entity.User;
//import com.lichuang.fruitvarietysm.user.finalproperties.AccountCode;
//import com.lichuang.fruitvarietysm.user.finalproperties.EmailType;
//import com.lichuang.fruitvarietysm.user.util.MD5Util;
//import org.springframework.beans.factory.annotation.Autowired;
//import org.springframework.data.redis.core.StringRedisTemplate;
//import org.springframework.messaging.Message;
//import org.springframework.messaging.MessageChannel;
//import org.springframework.messaging.support.MessageBuilder;
//import org.springframework.web.bind.annotation.*;
//
//import javax.annotation.Resource;
//import javax.servlet.http.HttpServletRequest;
//import java.time.Duration;
//import java.util.HashMap;
//import java.util.Map;
//import java.util.UUID;
//
//@RestController
//@RequestMapping("//user/security")
//public class AccountSecurityController {
//
//    @Resource(name = "emailoutput")
//    private MessageChannel emailoutput;
//
//    @Autowired
//    private UserController userController;
//
//    @Autowired
//    private StringRedisTemplate redisTemplate;
//
//    // 修改邮箱
////    @PostMapping("/modifyEmail")
////    public Map modifyEmail(@CookieValue(value = "loginToken") String loginToken, String email) {
////        Map<String, String> map = new HashMap<>();
////        User user = userController.getCurrentUser(loginToken);
////        if (user == null) {
////            // 没有登录
////            map.put("code", AccountCode.UNLOGIN);
////            map.put("message", "没有登录");
////            return map;
////        }
////        user.setUserEmail(email);
////        userController.updateUserWithRedis(user);
////        map.put("code", AccountCode.OK);
////        map.put("message", "修改邮箱成功");
////        return map;
////    }
//
//    public User modifyEmailById(Integer userId, String email) {
//        User user = new User();
//        user.setUserId(userId);
//        user.setUserEmail(email);
//        return userController.updateUserWithRedis(user);
//    }
//
//    // 修改手机号
////    @PostMapping("/modifyPhone")
////    public Map modifyPhone(@CookieValue(value = "loginToken") String loginToken, String phone) {
////        Map<String, String> map = new HashMap<>();
////        User user = userController.validateIsLogin(loginToken);
////        if (user == null) {
////            // 没有登录
////            map.put("code", AccountCode.UNLOGIN);
////            map.put("message", "没有登录");
////            return map;
////        }
////        user.setUserPhone(phone);
////        userController.updateUserWithRedis(user);
////        map.put("code", AccountCode.OK);
////        map.put("message", "修改手机号成功");
////        return map;
////    }
//
//    /**
//     * 验证密码是否正确
//     *
//     * @param loginToken
//     * @param password
//     * @return
//     */
//    @PostMapping("/validatePassWord")
//    public Map validatePassWord(@CookieValue(value = "loginToken") String loginToken, String password) {
//        Map<String, String> map = new HashMap<>();
//        User user = userController.getCurrentUser(loginToken);
//        if (user == null) {
//            // 没有登录
//            map.put("code", AccountCode.UNLOGIN);
//            map.put("message", "没有登录");
//            return map;
//        }
//        String md5Pwd = MD5Util.MD5Encode(password, "UTF-8", false);
//        if (md5Pwd.equals(user.getUserPassword())) {
//            map.put("code", AccountCode.OK);
//            map.put("message", "密码匹配成功");
//            return map;
//        } else {
//            map.put("code", AccountCode.NO);
//            map.put("message", "密码匹配失败");
//            return map;
//        }
//    }
//
//    /**
//     * 修改密码
//     *
//     * @param loginToken
//     * @param newPassWord
//     * @return
//     */
//    @PostMapping("/modifyPassWord")
//    public Map modifyPassWord(@CookieValue(value = "loginToken") String loginToken, String newPassWord) {
//        Map<String, String> map = new HashMap<>();
//        User user = userController.getCurrentUser(loginToken);
//        if (user == null) {
//            // 没有登录
//            map.put("code", AccountCode.UNLOGIN);
//            map.put("message", "没有登录");
//            return map;
//        }
//        // 将新密码加密
//        String md5Pwd = MD5Util.MD5Encode(newPassWord, "UTF-8", false);
//        user.setUserPassword(md5Pwd);
//        userController.updateUserWithRedis(user);
//        map.put("code", AccountCode.OK);
//        map.put("message", "设置密码成功");
//        return map;
//    }
//
//    /**
//     * 修改密码，通过用户id
//     *
//     * @param userId
//     * @param newPassWord
//     */
////    public void modifyPassWordById(Integer userId, String newPassWord) {
////        User user = userController.readUserWithRedis(userId);
////        String md5Pwd = MD5Util.MD5Encode(newPassWord, "UTF-8", false);
////        user.setUserId(userId);
////        user.setUserPassword(md5Pwd);
////        userController.updateUserWithRedis(user);
////    }
//
//    /**
//     * 发送修改密码的验证邮件
//     *
//     * @param loginToken
//     * @return
//     */
//    @PostMapping("/sendValidateEmailForModifyPwd")
//    public Map sendValidateEmailForModifyPwd(@CookieValue(value = "loginToken") String loginToken) {
//        Map<String, String> map = new HashMap<>();
//        User user = userController.getCurrentUser(loginToken);
//        if (user == null) {
//            // 没有登录
//            map.put("code", AccountCode.UNLOGIN);
//            map.put("message", "没有登录");
//            return map;
//        }
//        String token = UUID.randomUUID().toString().replaceAll("-", "");
//        String key = "emailTokenForModifyPwd::" + user.getUserId();
//        // token的过期时间，小时为单位
//        long timeoutOfHours = 72;
//        redisTemplate.opsForValue().set(key, token, Duration.ofHours(timeoutOfHours));
//        /**
//         * 定义message，让消息中间件发送邮件
//         * Message
//         */
//        Message message = MessageBuilder.withPayload(user)
//                .setHeader("emailType", EmailType.VALIDATEFORMODIFYPWD)
//                .setHeader("token", token)
//                .build();
//        emailoutput.send(message);
//        map.put("code", AccountCode.OK);
//        map.put("message", "发送验证邮件成功");
//        return map;
//    }
//
//    /**
//     * 用户点击邮箱中的验证地址，跳转到修改密码页面
//     * 判断token和userId是否对应，不对应就提示链接失效
//     * 让用户输入密码
//     * 用户提交时把id,token,pwd带上，再次判断id和token是否对应，不对应就返回
//     * 修改用户密码，并更新缓存
//     *
//     */
//
//    /**
//     * 用户点击用邮箱修改密码的请求
//     * @param token
//     * @param userId
//     * @param passWord
//     * @return
//     */
//    @GetMapping("/modifyPwdWithEmail")
//    public String modifyPwdWithEmail(String token, Integer userId, String passWord) {
//        String key = "emailTokenForModifyPwd::" + userId;
//        String tokenInRedis = redisTemplate.opsForValue().get(key);
//        if (token.equals(tokenInRedis)) {
//            // redis中的token和请求的token一致，重置密码
//            accountSecurityController.modifyPassWordById(userId, passWord);
//            redisTemplate.delete("emailTokenForModifyPwd::" + userId);
//            return "";
//        }
//        // 操作失败
//        return "";
//    }
//
//
//    @PostMapping("/sendValidateEmailForBindEmail")
//    public Map sendValidateEmailForBindEmail(HttpServletRequest request, String email) {
//        Map<String, String> map = new HashMap<>();
//        User user = userController.showUserInfo(request);
//        if (user == null) {
//            // 没有登录
//            map.put("code", AccountCode.UNLOGIN);
//            map.put("message", "没有登录");
//            return map;
//        }
//        String token = UUID.randomUUID().toString().replaceAll("-", "");
//        String key = "emailTokenForBindEmail::" + user.getUserId();
//        // token的过期时间，小时为单位
//        long timeoutOfHours = 72;
//        redisTemplate.opsForValue().set(key, token, Duration.ofHours(timeoutOfHours));
//        // 用来保存用户id对应的email，防止用户修改请求中的email绑定其他邮箱
//        redisTemplate.opsForValue().set("userIdEmail::" + user.getUserId(), email, Duration.ofHours(timeoutOfHours));
//        user.setUserEmail(email);
//        Message message = MessageBuilder.withPayload(user)
//                .setHeader("emailType", EmailType.VALIDATEFORBINDEMAIL)
//                .setHeader("token", token)
//                .build();
//        emailoutput.send(message);
//        map.put("code", AccountCode.OK);
//        map.put("message", "发送验证邮件成功");
//        return map;
//    }
//
//
//}
